package com.xh.demo.service;

import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Objects;
import java.util.concurrent.TimeUnit;

@Slf4j
@Component
public class RedisService {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    /**
     * 缓存对象（对象以json格式存储，字符串直接存储）
     */
    public boolean setJSON(String k, Object v, long expire, TimeUnit timeUnit) {
        try {
            if (Objects.isNull(v)) {
                return false;
            }
            String json;
            if (v instanceof String) {
                json = v.toString();
            } else {
                json = JSON.toJSONString(v);
            }
            stringRedisTemplate.opsForValue().set(k, json, expire, timeUnit);
            return true;
        } catch (Exception e) {
            log.error("【执行异常:】", e);
            return false;
        }
    }

    /**
     * 获取redis中的json数据，转为指定集合
     */
    public <E> List<E> getJSON2Collection(String k, Class<E> clazz) {
        try {
            String json = stringRedisTemplate.opsForValue().get(k);
            if (StrUtil.isEmpty(json)) {
                return null;
            }
            return JSON.parseArray(json, clazz);
        } catch (Exception e) {
            log.error("【redis缓存服务-查询缓存失败-getJSON2Collection：", e);
            return null;
        }
    }

    /**
     * 缓存对象（对象以json格式存储，字符串直接存储）
     */
    public boolean setJSON(String k, Object v, long seconds) {
        return setJSON(k, v, seconds, TimeUnit.SECONDS);
    }

    /**
     * 判断缓存中是否有对应的value
     *
     */
    public Boolean exists(final String key) {
        return stringRedisTemplate.hasKey(key);
    }

    /**
     * 获取redis中的json数据，转为指定对象
     */
    public <E> E getJSON2Obj(String k, Class<E> clazz) {
        try {
            String json = stringRedisTemplate.opsForValue().get(k);
            if (StrUtil.isEmpty(json)) {
                return null;
            }
            return JSON.parseObject(json, clazz);
        } catch (Exception e) {
            log.error("【执行异常:】", e);
            return null;
        }
    }

    /**
     * 获取字符串缓存
     */
    public String getString(String key) {
        return stringRedisTemplate.opsForValue().get(key);
    }

    /**
     * 批量删除对应的value
     */
    public void remove(final String... keys) {
        for (String key : keys) {
            remove(key);
        }
    }

    /**
     * 删除对应的value
     */
    public void remove(final String key) {
        stringRedisTemplate.delete(key);
    }

    /**
     * 简易版分布式锁
     *
     * @param key   key值
     * @param value value值
     * @param time  秒
     * @return {@link Boolean}
     */
    public Boolean setNx(String key, String value, long time) {
        return stringRedisTemplate.opsForValue().setIfAbsent(key, value, time, TimeUnit.SECONDS);
    }

}
